#include "my_queue.h"

volatile MY_QUEUE_t my_queue;

//错误处理
void queue_error(void)
{

}

/*清空队列*/
void clear_my_queue(void)
{
	memset((void*)&my_queue,0,sizeof(MY_QUEUE_t));
}

/*获取当前队列内数据数量*/
u16 get_queue_data_num(void)
{
	u16 ret=0;
	if(my_queue.front>my_queue.rear)
		ret=my_queue.front-my_queue.rear;
	else if(my_queue.front<my_queue.rear)
		ret=MY_QUEUE_MAXNUM-my_queue.rear+my_queue.front;
	else if(my_queue.front==my_queue.rear)
		ret=0;
	return ret;
}

/*写队列到队列头*/		//队列头在前面跑，如果追上了队列尾，就吃掉一个
void write_to_queue(MY_INFO_t info)
{
	//队列写满了，就覆盖掉最先写入的数据（也可以直接返回，忽略掉新添加的数据）
	if(my_queue.rear==((my_queue.front+1)%MY_QUEUE_MAXNUM))	{
		my_queue.rear=(my_queue.rear+1)%MY_QUEUE_MAXNUM;
	}
	//写入队列
	my_queue.info_queue[my_queue.front]=info;
	//队列头进一格
	my_queue.front=(my_queue.front+1)%MY_QUEUE_MAXNUM;			
}

/*从尾部读读队列*/		//队列尾在后面追，如果追上了队列头，说明队列无数据
//每次调用读队列为一个tick，超时时间为n ticks
void read_from_queue(void)
{
	if(my_queue.flags.busy==0){	//队列空闲
		if(my_queue.rear!=my_queue.front){
			my_queue.flags.busy=1;

			my_queue.info		=my_queue.info_queue[my_queue.rear];
			my_queue.otime		=0;
			my_queue.retryNum	=0;
			my_queue.rear		=(my_queue.rear+1)%MY_QUEUE_MAXNUM;		//队列尾追一格			
			
			//数据处理
			
		}
	}
	else{						//队列忙碌										
		my_queue.otime++;								//ticks+1
		if(my_queue.otime>my_queue.info.oTime){			//计时时间到
			my_queue.otime=0;
			if(my_queue.retryNum<my_queue.info.retryNum){//如果没有达到重试次数上限
				my_queue.retryNum++;
				//重试

			}
			else{										//异常，重试达到上限，调用错误处理
				queue_error();
				my_queue.retryNum=0;
				my_queue.flags.busy=0;
			}
		}
	}
}



